package graph.shapes;

import graph.parts.Shape;

import javax.vecmath.Vector2d;

import ogl.app.Texture;
import ogl.vecmath.Color;
import ogl.vecmath.Vector;
import ogl.vecmathimp.MatrixImp;
import shader.Shader;
import additional.Vertex;

public class Cuboid extends Shape {
		private float breite;
		private float tiefe;
		private float hoehe;
		private Vector middle = vec(0f,0f,0f);

		/**
		 * 
		 * @param breite
		 * @param tiefe
		 * @param hoehe
		 */
		public Cuboid(float b, float t, float h) {
			super.setMatrix((MatrixImp) MatrixImp.identity);
			breite = b;
			tiefe = t;
			hoehe = h;
			
			initPoints();
			initColors();
			initNormals();
			initTextureCoord();
			initVertices();
		}

		/**
		 * Konstruktor mit selbst definierter Kantenlänge und selbst definietem Mittelpunkt
		 * @param breite
		 * @param tiefe
		 * @param hoehe
		 * @param vector
		 */
		public Cuboid(float b, float t, float h, Vector middle) {
			super.setMatrix((MatrixImp) MatrixImp.identity);
			breite = b;
			tiefe = t;
			hoehe = h;
			this.middle = middle;
			
			initPoints();
			initColors();
			initTextureCoord();
			initVertices();
		}

		private void initPoints() {
			Float xVer = middle.x();
			Float yVer = middle.y();
			Float zVer = middle.z();
			
			p = new Vector[]{ 
					// unten links vorne
					vec(-breite + xVer, -hoehe + yVer, tiefe + zVer), 
					// unten rechts vorne
					vec(breite + xVer, -hoehe + yVer, tiefe + zVer),
					// oben rechts vorne
					vec(breite + xVer, hoehe + yVer, tiefe + zVer), 
					// oben links vorne
					vec(-breite + xVer, hoehe + yVer, tiefe + zVer), 
					// unten rechts hinten
					vec(breite + xVer, -hoehe + yVer, -tiefe + zVer), 
					// unten links hinten
					vec(-breite + xVer, -hoehe + yVer, -tiefe + zVer),
					// oben links hinten
					vec(-breite + xVer, hoehe + yVer, -tiefe + zVer), 
					// oben rechts hinten
					vec(breite + xVer, hoehe + yVer, -tiefe + zVer) 
			};
		}

		private void initColors() {
			c = new Color[]{ 
				      col(1, 0, 0), 
				      col(1, 0, 0), 
				      col(1, 0, 0), 
				      col(1, 0, 0),
				      col(1, 1, 0), 
				      col(1, 1, 0), 
				      col(1, 1, 0), 
				      col(1, 1, 0) 
			};
		}

		private void initNormals() {
			n = new Vector[] {
					vec(0, 0, 1),
			        vec(0, 0, -1),
			        vec(1, 0, 0),
			        vec(0, 1, 0),
			        vec(-1, 0, 0),
			        vec(0, -1, 0)
				};
		}

		private void initTextureCoord() {
			t = new Vector2d[] {
				new Vector2d (0f, 0f),
			    new Vector2d (10f, 0f),
			    new Vector2d (0f, 10f),
			    new Vector2d (10f, 10f),
			};
		}

		private void initVertices() {
			vertices = new Vertex[] {
				    // front
				    v(p[0], c[0], n[0], t[0]), 
				    v(p[1], c[1], n[0], t[1]), 
				    v(p[2], c[2], n[0], t[2]), 
				    v(p[3], c[3], n[0], t[3]),
				    // back
				    v(p[4], c[4], n[1], t[0]), 
				    v(p[5], c[5], n[1], t[1]), 
				    v(p[6], c[6], n[1], t[2]), 
				    v(p[7], c[7], n[1], t[3]),
				    // right
				    v(p[1], c[1], n[2], t[0]), 
				    v(p[4], c[4], n[2], t[1]), 
				    v(p[7], c[7], n[2], t[2]), 
				    v(p[2], c[2], n[2], t[3]),
				    // top
				    v(p[3], c[3], n[3], t[0]), 
				    v(p[2], c[2], n[3], t[1]), 
				    v(p[7], c[7], n[3], t[2]), 
				    v(p[6], c[6], n[3], t[3]),
				    // left
				    v(p[5], c[5], n[4], t[0]), 
				    v(p[0], c[0], n[4], t[1]), 
				    v(p[3], c[3], n[4], t[2]), 
				    v(p[6], c[6], n[4], t[3]),
				    // bottom
				    v(p[5], c[5], n[5], t[0]), 
				    v(p[4], c[4], n[5], t[1]), 
				    v(p[1], c[1], n[5], t[2]), 
				    v(p[0], c[0], n[5], t[3]) 
			};
			
			initVertexData();
		}
		
	}

